package org.zhuchen.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 数组的转集合的方式：参考：https://blog.csdn.net/x541211190/article/details/79597236
 * </p>
 *
 * @author: Sunny
 * @date: 2021/2/24
 * @version: v1.0.0
 */
public class Array2List {

    public static void main(String[] args) {
        String[] array = {"1", "2", "3"};
        /**
         * 方法1：Arrays.asList(strArray) 方式,将数组转换List后，不能对List增删，只能查改，否则抛异常。
         * 抛异常原因：Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList，它并非java.util.ArrayList类。
         * java.util.Arrays.ArrayList类具有 set()，get()，contains()等方法，但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。
         * 适用场景：仅作为数据源读取使用。
         */
        List<String> list1 = Arrays.asList(array);
        System.out.println(list1);

        /**
         * 方法2：通过ArrayList的构造器，将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList。
         * 适用场景：需要在将数组转换为List后，对List进行增删改查操作，在List的数据量不大的情况下，可以使用。
         */
        List<String> list2 = new ArrayList<>(list1);
        System.out.println(list2);

        /**
         * 方法3：通过Collections.addAll(arrayList, strArray)方式转换，根据数组的长度创建一个长度相同的List，然后通过Collections.addAll()方法，
         * 将数组中的元素转为二进制，然后添加到List中，这是最高效的方法。
         * 适用场景：需要在将数组转换为List后，对List进行增删改查操作，在List的数据量巨大的情况下，优先使用，可以提高操作速度。
         */
        List<String> list3 = new ArrayList<>(3);
        Collections.addAll(list3, array);
        System.out.println(list3);

        /**
         * 方法:4：JDK版本在1.8以上，可以使用流stream来将下列3种数组快速转为List，分别是int[]、long[]、double[]，其他数据类型比如short[]、byte[]、char[]，在JDK1.8中暂不支持。
         * 由于这只是一种常用方法的封装，不再纳入一种崭新的数组转List方式，暂时算是java流送给我们的常用工具方法吧。
         */
        List<String> list4 = Arrays.stream(array).collect(Collectors.toList());
        System.out.println(list4);
    }

}
